package interpreteur;

import interpreteur.action.Foncteur;
import interpreteur.action.Si;
import interpreteur.action.TantQue;
import interpreteur.action.SiChaine;
import interpreteur.action.ChaineFoncteur;
import interpreteur.action.TantQueEtSi;
import interpreteur.echecs.Echiquier;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import static interpreteur.FoncteurUtile.*;

public class Regle extends HashMap<String, Foncteur> implements Echiquier {

    public static final String ARRVIDE = "ArrVide";
    public static final String DIRECTIONCASROICAVALIER = "DirectionCasRoiCavalier";
    public static final String DIRSUIVANTE = "DirSuivante";
    public static final String NEWCOUPS = "NewCoups";
    public static final String PARCOURIR = "parcoursEchq";
    public static final String SIARROCCUPETPIECESCOULOPP = "SiArrOccupEtPiecesCoulOpp";
    public static final String TANTQUEDIRECTION = "TantQueDirection";

    public Regle() {
        new FoncteurUtile();
        //actions de base
        put(ARRVIDE, ArrVide);
        put("existeDirSuiv", existeDirSuiv);
        put("estPionDep", estPionDep);
        put("estFinDirPion", estFinDirPion);
        put("ExamineEchecs", ExamineEchecs);
        put("PieceCouleurQuiJoue", PieceCouleurQuiJoue);
        put("PieceCouleurEtudiee", PieceCouleurEtudiee);
        put("existeCaseSuiv", existeCaseSuiv);
        put("ArrOccupEtPiecesCoulOpp", ArrOccupEtPiecesCoulOpp);
        put("ArrOccup_PiecesCoulOpp", ArrOccup_PiecesCoulOpp);
        put("ArrVideOu_ArrOccupEtPiecesCoulOpp", ArrVideOu_ArrOccupEtPiecesCoulOpp);
        put(NEWCOUPS, NewCoups);
        put("NewArrayListCoups", NewArrayListCoups);
        put("InitDir", InitDir);
        put("AjoutCoupsListe", AjoutCoupsListe);
        put("CaseSuivante", CaseSuivante);
        put(DIRSUIVANTE, DirSuivante);
        put("DistSuivante", DistSuivante);
        put("InitDist", InitDist);
        put("InitIndex", InitIndex);
        put("estFouTourDame", estFouTourDame);
        put("estPion", estPion);
        put("estRoiOuCavalier", estRoiOuCavalier);
        //------ Regles :
        //
        //TantQueEtSi
        //TantQue
        //Si
        //SiChaine et Actionchaine
        //
        put(DIRECTIONCASROICAVALIER, new TantQueEtSi(get("existeDirSuiv"), get("ArrVideOu_ArrOccupEtPiecesCoulOpp"), get(NEWCOUPS), get(DIRSUIVANTE)));
        put(TANTQUEDIRECTION, new TantQue(get(ARRVIDE), get(NEWCOUPS), get("DistSuivante")));
        put(SIARROCCUPETPIECESCOULOPP, new Si(get("ArrOccupEtPiecesCoulOpp"), get(NEWCOUPS)));
        put(DIRECTIONCASROICAVALIER, get(DIRECTIONCASROICAVALIER));
        put(TANTQUEDIRECTION, get(TANTQUEDIRECTION));
        put(SIARROCCUPETPIECESCOULOPP, get(SIARROCCUPETPIECESCOULOPP));
        put("FouTourDameActionTabChaine", get(TANTQUEDIRECTION), get(SIARROCCUPETPIECESCOULOPP), get("InitDist"));
        put("FouTourDameWhile", new TantQue(get("existeDirSuiv"), get("FouTourDameActionTabChaine"), get(DIRSUIVANTE)));
        put("SiPionArrVide", new Si(get(ARRVIDE), get(NEWCOUPS)));
        put("PionAuDepartTabCaine", get("DistSuivante"), get("SiPionArrVide"));
        put("SiPionAuDepart", new Si(get("estPionDep"), get("PionAuDepartTabCaine")));
        put("PionCaseArriveeVideTabChaine", get(NEWCOUPS), get("SiPionAuDepart"));
        put("PionAction2", new TantQue(get("estFinDirPion"), get(SIARROCCUPETPIECESCOULOPP), get(DIRSUIVANTE)));
        put("Si", new Si(get(ARRVIDE), get("PionCaseArriveeVideTabChaine")));
        put("PionActionTabChaine", get("InitIndex"), get("Si"), get("InitDir"), get(DIRSUIVANTE), get("PionAction2"));
        put("RoiCavalierActionTabChaine", get("InitDist"), get(DIRECTIONCASROICAVALIER));
        put("SiChaine", get("estFouTourDame"), get("estPion"), get("estRoiOuCavalier"),
                get("FouTourDameWhile"), get("PionActionTabChaine"), get("RoiCavalierActionTabChaine"));
        put("ParcourirDirections", get("NewArrayListCoups"), get("InitIndex"), get("SiChaine"), get("AjoutCoupsListe"));
        put(PARCOURIR, new TantQueEtSi(get("existeCaseSuiv"), get("PieceCouleurEtudiee"),
                get("ParcourirDirections"), get("CaseSuivante")));

    }

    private void put(String chaine, Foncteur f1, Foncteur f2) {
        List<Foncteur> Liste = new ArrayList<Foncteur>();
        Liste.add(f1);
        Liste.add(f2);
        put(chaine, new ChaineFoncteur(Liste));
    }

    private void put(String chaine, Foncteur f1, Foncteur f2, Foncteur f3) {
        List<Foncteur> Liste = new ArrayList<Foncteur>();
        Liste.add(f1);
        Liste.add(f2);
        Liste.add(f3);
        put(chaine, new ChaineFoncteur(Liste));
    }

    private void put(String chaine, Foncteur f1, Foncteur f2, Foncteur f3, Foncteur f4) {
        List<Foncteur> Liste = new ArrayList<Foncteur>();
        Liste.add(f1);
        Liste.add(f2);
        Liste.add(f3);
        Liste.add(f4);
        put(chaine, new ChaineFoncteur(Liste));
    }

    private void put(String chaine, Foncteur f1, Foncteur f2, Foncteur f3, Foncteur f4, Foncteur f5) {
        List<Foncteur> Liste = new ArrayList<Foncteur>();
        Liste.add(f1);
        Liste.add(f2);
        Liste.add(f3);
        Liste.add(f4);
        Liste.add(f5);
        put(chaine, new ChaineFoncteur(Liste));
    }

    private void put(String chaine, Foncteur f1a, Foncteur f2a, Foncteur f3a, Foncteur f1b, Foncteur f2b, Foncteur f3b) {
        Foncteur[] tabA = {f1a, f2a, f3a};
        Foncteur[] tabB = {f1b, f2b, f3b};
        put(chaine, new SiChaine(tabA, tabB));
    }
}

